home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Communication / Gazetteer / Source / Storm.m < prev    next >
Text File  |  1994-05-23  |  8KB  |  368 lines

  1. /*
  2.  * Object to peck on a remote network weather service.
  3.  *
  4.  * Michael Hawley
  5.  * MIT Media Laboratory
  6.  * 20 Ames Street
  7.  * Cambridge, MA 02139
  8.  * mike@media-lab.mit.edu
  9.  * Copyright (c) 1991 MIT Media Laboratory
  10.  * Burn before reading!  This means you!!
  11.  *
  12.  * Please forward any comments/revisions.
  13.  * Keep in mind that this was a one-day knock off;
  14.  * much of the complexity is due to the fact that
  15.  * we have to parse a telnet conversation that was
  16.  * never intended for such.
  17.  */
  18.  
  19. #import "Storm.h"
  20. #import "Process.h"
  21. #import <appkit/appkit.h>
  22. #import "DefaultHandler.h"
  23. #import "util.h"
  24.  
  25. @implementation Storm
  26.  
  27. int StormDebug = 1;
  28. id _status;
  29. id _defaults;
  30. id _PutHere;
  31. extern setState(), ReadState(), runState(), access(), 
  32.        getReport(), sleep(), execState();
  33.  
  34. char *
  35. path(char *s)
  36. /*
  37.  * if 's' is in [NXArgv[0]], return [NXArgv[0]]/s.
  38.  * (for looking up internal commands and files in .../Opener.app/...).
  39.  */
  40. {
  41.     char t[1024], *q, *r;
  42.     static char p[1024];
  43.     extern char **NXArgv;
  44.     *t = '\0';
  45.     sscanf(s,"%s",t);
  46.     if (!*t || *t=='(') return s;
  47.     r = s + strlen(t);
  48.     strcpy(p,*NXArgv);
  49.     if (q=rindex(p,'/'))
  50.         strcpy(q+1,t);
  51.     else
  52.         strcpy(p,t);
  53.     if (access(p,0)==0){
  54.         strcpy(p+strlen(p),r);
  55.         return p;
  56.     }
  57.     return s;
  58. }
  59.  
  60. static void say(s, a,b,c,d) id s; char *a,*b,*c,*d; {
  61.     char p[1024];
  62.     sprintf(p,a,b,c,d);
  63.     [s setStringValue:p];
  64.     [s display];
  65.     NXPing();
  66. }
  67.  
  68. void message(a,b,c,d) char *a,*b,*c,*d; {
  69.     say(_status,a,b,c,d);
  70. }
  71.  
  72. static int eq(char *a, char *b){ return strncmp(a,b,strlen(b))==0; }
  73.  
  74.  
  75. static void put(P, fmt, a, b, c, d) id P; char *fmt, *a, *b, *c, *d; {
  76.     char p[1024];
  77.     sprintf(p,fmt,a,b,c,d);
  78.     if (Verbose) printf("+ %s\n",p);
  79.     [P puts:p]; 
  80. }
  81.  
  82. void Put(fmt, a, b, c, d) char *fmt, *a, *b, *c, *d; {
  83.     put(_PutHere,fmt,a,b,c,d);
  84. }
  85.  
  86.  
  87. static char *
  88. get(P, s, n) id P; char *s; int n; {
  89.     [P gets:s:n];
  90.     if (*s && Verbose) printf("> %s",s);
  91.     return *s? s : (char *)0; 
  92. }
  93.  
  94. char *
  95. pgets(s,n) char *s; int n; {
  96.     [_PutHere gets:s:n];
  97.     return *s? s : (char *)0; 
  98. }
  99.  
  100. /* #ifdef 0
  101. static char *
  102. flush(P,s) id P; char *s; {
  103.     static char t[1024];
  104.     while (get(P,t,sizeof t))
  105.         if (strindex(t,s)) return t;
  106.     sleep(1);
  107.     while (get(P,t,sizeof t))
  108.         if (strindex(t,s)) return t;
  109.     return (char *)0;
  110. }
  111. #endif
  112. */
  113.  
  114. char *
  115. Flush(s) char *s; {
  116.     static char t[1024];
  117.     if (_PutHere) return (char *)0;
  118.     while (get(_PutHere,t,sizeof t))
  119.         if (strindex(t,s)) return t;
  120.     sleep(1);
  121.     while (get(_PutHere,t,sizeof t))
  122.         if (strindex(t,s)) return t;
  123.     return (char *)0;
  124. }
  125.  
  126. - enable:(BOOL)b {
  127.     [attachB setIcon:b? "plug" : "unplug"];
  128.     return self;
  129. }
  130.  
  131. static id _text, _scroll;
  132.  
  133. - initMatrix {
  134.     // from the nib file, we have the help text; keep a pointer to it.
  135.     _text = helpText = [scrollView docView];
  136.     [_text setDelegate:self];
  137.     [_text setMarginLeft:6.0 right:6.0 top:0.0 bottom:0.0];
  138.     [_text notifyAncestorWhenFrameChanged:YES];
  139.     return self;
  140. }
  141.  
  142. - setScrollView:anObject {
  143.     _scroll = scrollView = anObject;
  144.     [self initMatrix];
  145.     return self;
  146. }
  147.  
  148. extern char DefaultFont[];
  149. extern char DefaultFontSize[];
  150. static id fid = (id)0;
  151. static int canconvert = 0;
  152. // double atof();
  153.  
  154. - textWillConvert:textObject fromFont:from toFont:to {
  155.     if (canconvert && strcmp(DefaultFont,[from name])==0 &&
  156.     atof(DefaultFontSize) == [from pointSize]){
  157.     strcpy(DefaultFont,[to name]);
  158.     sprintf(DefaultFontSize,"%f",[to pointSize]);
  159.     fid = to;
  160.     [_defaults writeDefaults:self];
  161.     }
  162.     return to;
  163. }
  164.  
  165. void
  166. setText(s) char *s; {
  167.     static NXPoint origin = {0.0,0.0};
  168.     char *p = index(s,'\n')+1;  /* skip past first (blank) line */
  169.     id w = [_scroll window];
  170.  
  171.     if (!fid){
  172.         fid = [Font newFont:DefaultFont size:atof(DefaultFontSize)];
  173.     }
  174.     canconvert=0;
  175.     [w disableFlushWindow];
  176.     [_text setText:s];
  177.     [_text setSel:p-s:strlen(s)];
  178.     [_text setSelGray:0.0];
  179.     [_text setSelFont:fid];
  180.     [_text selectNull];
  181.     [_text scrollPoint:&origin];
  182.     [_scroll display];
  183.     [[w reenableFlushWindow] flushWindow];
  184.     canconvert=1;
  185. }
  186.  
  187. void
  188. setFile(s) char *s; {
  189.     NXStream *f = NXMapFile(path(s),NX_READONLY);
  190.     static NXPoint origin = {0.0,0.0};
  191.     id w = [_scroll window];
  192.  
  193.     canconvert=0;
  194.     s = path(s);
  195.     if (!f) return ;
  196.     [w disableFlushWindow];
  197.     [_text setMonoFont:NO];
  198.     [_text readRichText:f];
  199.     [_text scrollPoint:&origin];
  200.     NXCloseMemory(f,NX_FREEBUFFER);
  201.     [_scroll display];
  202.     [[w reenableFlushWindow] flushWindow];
  203. }
  204.  
  205. - showHelp:sender {
  206.     setFile("info");
  207.     return self;
  208. }
  209.  
  210. #define Case break; case
  211.  
  212. void
  213. squishRtn(char *s){
  214.     char *p = s;
  215.  
  216.     while (*p = *s++)
  217.         if (*p != '\r') ++p;
  218. }
  219.  
  220. static char *
  221. getLine(char *s, char *t){ /* read ...\n from s into t; return new s */
  222.     char *p = t;
  223.     *t = '\0';
  224.     squishRtn(s);
  225.     while (*s && *s != '\n') *p++ = *s++;
  226.     if (*s == '\n') *p++ = *s++;
  227.     *p++ = '\0';
  228.     if (*t == '\0') return (char *)0;
  229.     if (Verbose) printf("- %s",t);
  230.     return s;
  231. }
  232.  
  233. - processOutput:(char *)s {
  234.     static char prev[8192]="";
  235.     char t[1024], *p=prev;
  236.  
  237.     strcat(prev,s); s = t;
  238.     while ((p=getLine(p,s)) && 
  239.            (index(s,'\n') || strcmp(s+strlen(s)-2,": ")==0))
  240.         execState(0,s);
  241.     strcpy(prev,blank(s)?s:"");
  242.     return self;
  243. }
  244.  
  245. - hitFormat:sender {
  246.     extern setFormat();
  247.     char *s = (char *)[[sender selectedCell] title];
  248.     setFormat(s);
  249.     return self;
  250. }
  251.  
  252. - query:sender {
  253.     char buf[80000];
  254.     Put("%s\n",[form stringValueAt:0]);
  255.     pgets(buf,256);
  256.     getReport(buf);
  257.     setText(buf);
  258.     Put("\n");
  259.     [form selectTextAt:0];
  260.     return self;
  261. }
  262.  
  263. static id me;
  264.  
  265. void
  266. Command(s) char *s; {
  267.     _PutHere = [Process new:s delegate:me];
  268. }
  269.  
  270. - login:sender {
  271.     if (_PutHere) [_PutHere free]; P = _PutHere = (id)0;
  272.     _status = status;
  273.     ReadState(path("menus"));
  274.     [attachB setIcon:"plug"];
  275.     [form selectTextAt:0];
  276.     runState("");
  277.     return self;
  278. }
  279.  
  280. - logout:sender {
  281.     if (P && _PutHere) setState("Detach"), runState("");
  282.     if (P) [P terminate:self];
  283.     _PutHere = P = (id)0;
  284.     [self enable:NO];
  285.     [attachB setIcon:"unplug"];
  286.     message("not connected.");
  287.     return self;
  288. }
  289.  
  290. void
  291. logout(){
  292.     [me logout:me];
  293. }
  294.  
  295. - ensurelogin {
  296.     //if (!_PutHere) [self login:self];
  297.     return self;
  298. }
  299.  
  300. int
  301. ensurelogin(){
  302.     [me ensurelogin];
  303.     return _PutHere? 1 : 0;
  304. }
  305.  
  306. - attach:sender {
  307.     if (eq((char *)[sender icon],"unplug")){
  308.         [self login:sender];
  309.     } else {
  310.         [self logout:sender];
  311.     }
  312.     return self;
  313. }
  314.  
  315. /*
  316.  * telnet:
  317.  */
  318. - copyString:(char *)s {
  319.   id p = [Pasteboard new];
  320.   [p declareTypes:&NXAsciiPboard num:1 owner:self];
  321.   [p writeType:NXAsciiPboard data:s length:strlen(s)];
  322.   return self;
  323. }
  324.  
  325. - launchTerminal:(char *)program {
  326.   id p = [NXApp appSpeaker];
  327.   port_t t = NXPortFromName("Terminal",NULL);
  328.   int ok;
  329.   if (t==PORT_NULL) return self;
  330.   [p setSendPort:t];
  331.   [self copyString:program];
  332.   (void)[p msgPaste:&ok];
  333.   return self;
  334. }
  335.  
  336. - telnet:sender {
  337.     [self launchTerminal:"telnet martini.eecs.umich.edu 3000\n"];
  338.     return self;
  339. }
  340.  
  341. - sendComments:sender {
  342.     return self;
  343. }
  344.  
  345. + new {
  346.     me = self = [[Storm alloc] init];
  347.     return self;
  348. }
  349.  
  350. - free {
  351.     [self logout:self];
  352.     return [super free];
  353. }
  354.  
  355. - appDidInit:sender {
  356.     _defaults = [DefaultHandler new];
  357.     [attachB performClick:sender];
  358.     return self;
  359. }
  360.  
  361. - appWillTerminate:sender {
  362.     [self logout:self];
  363.     [_defaults writeDefaults:self];
  364.     return self;
  365. }
  366.  
  367. @end
  368.